font chooser: Add properties for features and language
authorMatthias Clasen <mclasen@redhat.com>
Wed, 3 Jan 2018 04:52:24 +0000 (23:52 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 3 Jan 2018 17:18:18 +0000 (12:18 -0500)
These can't be returned as part of the font description,
so we need new api for them. For now, this is just readonly
properties. Maybe these should be writable too, eventually.

docs/reference/gtk/gtk4-sections.txt
gtk/gtkfontbutton.c
gtk/gtkfontchooser.c
gtk/gtkfontchooser.h
gtk/gtkfontchooserutils.c
gtk/gtkfontchooserutils.h
gtk/gtkfontchooserwidget.c

index c3ba7f4df68ff0c42b5de3dd9dc49ae8213373be..d0ab719b088949545193d78341bf2a32a5610cc8 100644 (file)
@@ -1305,6 +1305,8 @@ gtk_font_chooser_get_font
 gtk_font_chooser_set_font
 gtk_font_chooser_get_font_desc
 gtk_font_chooser_set_font_desc
+gtk_font_chooser_get_font_features
+gtk_font_chooser_get_font_language
 gtk_font_chooser_get_preview_text
 gtk_font_chooser_set_preview_text
 gtk_font_chooser_get_show_preview_entry
index 739cba89237d347c6d0ae6a788a4996daf9bfbae..6b7932a4a417953d604ce8838118eacaae3ccb25 100644 (file)
@@ -83,6 +83,8 @@ struct _GtkFontButtonPrivate
   PangoFontFace        *font_face;
   PangoFontMap         *font_map;
   gint                  font_size;
+  char                 *font_features;
+  char                 *language;
   gchar                *preview_text;
   GtkFontFilterFunc     font_filter;
   gpointer              font_filter_data;
@@ -159,6 +161,12 @@ clear_font_data (GtkFontButton *font_button)
 
   g_free (priv->fontname);
   priv->fontname = NULL;
+
+  g_free (priv->font_features);
+  priv->font_features = NULL;
+
+  g_free (priv->language);
+  priv->language = NULL;
 }
 
 static void
@@ -699,6 +707,12 @@ gtk_font_button_get_property (GObject    *object,
     case GTK_FONT_CHOOSER_PROP_FONT_DESC:
       g_value_set_boxed (value, gtk_font_button_get_font_desc (font_button));
       break;
+    case GTK_FONT_CHOOSER_PROP_FONT_FEATURES:
+      g_value_set_string (value, priv->font_features);
+      break;
+    case GTK_FONT_CHOOSER_PROP_LANGUAGE:
+      g_value_set_string (value, priv->language);
+      break;
     case GTK_FONT_CHOOSER_PROP_LEVEL:
       g_value_set_enum (value, priv->level);
       break;
@@ -1007,6 +1021,10 @@ response_cb (GtkDialog *dialog,
   if (priv->font_face)
     g_object_ref (priv->font_face);
   priv->font_size = gtk_font_chooser_get_font_size (font_chooser);
+  g_free (priv->font_features);
+  priv->font_features = gtk_font_chooser_get_font_features (font_chooser);
+  g_free (priv->language);
+  priv->language = gtk_font_chooser_get_language (font_chooser);
 
   /* Set label font */
   gtk_font_button_update_font_info (font_button);
@@ -1031,7 +1049,9 @@ dialog_destroy (GtkWidget *widget,
 } 
 
 static gchar *
-pango_font_description_to_css (PangoFontDescription *desc)
+pango_font_description_to_css (PangoFontDescription *desc,
+                               const char           *features,
+                               const char           *language)
 {
   GString *s;
   PangoFontMask set;
@@ -1153,6 +1173,10 @@ pango_font_description_to_css (PangoFontDescription *desc)
     {
       g_string_append_printf (s, "font-size: %dpt", pango_font_description_get_size (desc) / PANGO_SCALE);
     }
+  if (features)
+    {
+      g_string_append_printf (s, "font-feature-settings: %s;", features);
+    }
 
   g_string_append (s, "}");
 
@@ -1193,7 +1217,7 @@ gtk_font_button_label_use_font (GtkFontButton *font_button)
       if (!priv->use_size)
         pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE);
 
-      data = pango_font_description_to_css (desc);
+      data = pango_font_description_to_css (desc, priv->font_features, priv->language);
       gtk_css_provider_load_from_data (priv->provider, data, -1);
 
       g_free (data);
index 41bb4b4a0e545a23bdd3ebb7aa183e718abfe59b..5c1547d75be37dac22476934798744d4748408fd 100644 (file)
@@ -121,6 +121,39 @@ gtk_font_chooser_default_init (GtkFontChooserInterface *iface)
                          GTK_FONT_CHOOSER_LEVEL_FONT,
                          GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 
+  /**
+   * GtkFontChooser:font-features:
+   *
+   * The selected font features, in a format that is compatible with
+   * CSS and with Pango attributes.
+   *
+   * Since: 3.94
+   */
+  g_object_interface_install_property
+     (iface,
+      g_param_spec_string ("font-features",
+                          P_("Font features"),
+                          P_("Font features as a string"),
+                          "",
+                          GTK_PARAM_READABLE));
+
+  /**
+   * GtkFontChooser:language:
+   *
+   * The language for which the #GtkFontChooser:font-features were
+   * selected, in a format that is compatible with CSS and with Pango
+   * attributes.
+   *
+   * Since: 3.94
+   */
+  g_object_interface_install_property
+     (iface,
+      g_param_spec_string ("language",
+                          P_("Language"),
+                          P_("Language for which features have been selected"),
+                          "",
+                          GTK_PARAM_READABLE));
+
   /**
    * GtkFontChooser::font-activated:
    * @self: the object which received the signal
@@ -536,3 +569,45 @@ gtk_font_chooser_get_level (GtkFontChooser *fontchooser)
 
   return level;
 }
+
+/**
+ * gtk_font_chooser_get_font_features:
+ * @fontchooser: a #GtkFontChooser
+ *
+ * Gets the currently-selected font features.
+ *
+ * Returns: the currently selected font features
+ * Since: 3.94
+ */
+char *
+gtk_font_chooser_get_font_features (GtkFontChooser *fontchooser)
+{
+  char *text;
+
+  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
+
+  g_object_get (fontchooser, "font-features", &text, NULL);
+
+  return text;
+}
+
+/**
+ * gtk_font_chooser_get_language:
+ * @fontchooser: a #GtkFontChooser
+ *
+ * Gets the currently-selected language for font features.
+ *
+ * Returns: the currently selected language
+ * Since: 3.94
+ */
+char *
+gtk_font_chooser_get_language (GtkFontChooser *fontchooser)
+{
+  char *text;
+
+  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
+
+  g_object_get (fontchooser, "language", &text, NULL);
+
+  return text;
+}
index b60d92a50a0a98387f7b12170772a1e630312d14..18ca5d0b7019d4dcffaff80d8c223deac8bad8dc 100644 (file)
@@ -146,6 +146,10 @@ void             gtk_font_chooser_set_level                (GtkFontChooser   *fo
 GDK_AVAILABLE_IN_3_94
 GtkFontChooserLevel
                  gtk_font_chooser_get_level                (GtkFontChooser   *fontchooser);
+GDK_AVAILABLE_IN_3_94
+char *           gtk_font_chooser_get_font_features        (GtkFontChooser   *fontchooser);
+GDK_AVAILABLE_IN_3_94
+char *           gtk_font_chooser_get_language             (GtkFontChooser   *fontchooser);
 
 G_END_DECLS
 
index 09469bd3c909a0d37569be60b85d7dd868a26008..84079d276d87274fe66ce61c8a5891727c0b7017 100644 (file)
@@ -137,6 +137,12 @@ _gtk_font_chooser_install_properties (GObjectClass *klass)
   g_object_class_override_property (klass,
                                     GTK_FONT_CHOOSER_PROP_LEVEL,
                                     "level");
+  g_object_class_override_property (klass,
+                                    GTK_FONT_CHOOSER_PROP_FONT_FEATURES,
+                                    "font-features");
+  g_object_class_override_property (klass,
+                                    GTK_FONT_CHOOSER_PROP_LANGUAGE,
+                                    "language");
 }
 
 /**
index 8d4af1bd66ad19d2c407175a6ffb829c39e852eb..ac7bf18558baab9383aaf7ace8ba66fe8ea66ac5 100644 (file)
@@ -38,6 +38,8 @@ typedef enum {
   GTK_FONT_CHOOSER_PROP_PREVIEW_TEXT,
   GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY,
   GTK_FONT_CHOOSER_PROP_LEVEL,
+  GTK_FONT_CHOOSER_PROP_FONT_FEATURES,
+  GTK_FONT_CHOOSER_PROP_LANGUAGE,
   GTK_FONT_CHOOSER_PROP_LAST
 } GtkFontChooserProp;
 
index ad1cbe70376c8f12f7aa3714ebf5da7c7f8b3358..eb37bf84b387779bd4ddc032532582dd0af012f2 100644 (file)
@@ -330,6 +330,12 @@ gtk_font_chooser_widget_get_property (GObject         *object,
     case GTK_FONT_CHOOSER_PROP_LEVEL:
       g_value_set_enum (value, gtk_font_chooser_widget_get_level (fontchooser));
       break;
+    case GTK_FONT_CHOOSER_PROP_FONT_FEATURES:
+      g_value_set_string (value, fontchooser->priv->font_features);
+      break;
+    case GTK_FONT_CHOOSER_PROP_LANGUAGE:
+      g_value_set_string (value, pango_language_to_string (fontchooser->priv->font_language));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1863,6 +1869,7 @@ update_font_features (GtkFontChooserWidget *fontchooser)
     {
       g_free (priv->font_features);
       priv->font_features = g_string_free (s, FALSE);
+      g_object_notify (G_OBJECT (fontchooser), "font-features");
     }
   else
     g_string_free (s, TRUE);
@@ -1890,6 +1897,7 @@ update_language (GtkFontChooserWidget *fontchooser)
       if (priv->font_language != lang)
         {
           priv->font_language = lang;
+          g_object_notify (G_OBJECT (fontchooser), "language");
         }
     }